package com.koalac.ironman.net.pojo.response;

import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * 服务端返回参数协议的基础类，每一条正常返回的信息都包含error,msg,data。  
 * 其中，data内可能包含 obj:JSONObject , list:JSONArray , extend:JSONObject
 * @author cyleung
 *
 */
public class Response extends BaseResponse {
	String error = "0";
	String msg = "";
	JSONObject data = new JSONObject();
	
	public Response(String source){
		try {
			JSONObject jObject = new JSONObject(source);
			this.init(jObject);	
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	@Override
	public void init(JSONObject jObject) {
		if(null == jObject){
			return;
		}
		error = jObject.optString("error");
		msg = jObject.optString("msg");
		data = jObject.optJSONObject("data");
	}

	
	/**
	 * 将data中的obj转化成业务类实体
	 * @param Class<T> 
	 * @return
	 */
	public <T extends BaseResponse> T getObject(Class<T> t) {
		T obj = null;
		try {
			obj = t.newInstance();
			obj.init(data.optJSONObject("obj"));
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return obj;
	}
	/**
	 * 得到data中的obj JSONObject
	 * @return
	 */
	public JSONObject getObject(){
		return data.optJSONObject("obj");
	}
	
	/**
	 * 将data中的extend转化成业务类实体
	 * @param Class<T> 
	 * @return
	 */
	public <T extends BaseResponse> T getExtend(Class<T> t) {
		T obj = null;
		try {
			obj = t.newInstance();
			obj.init(data.optJSONObject("extend"));
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return obj;
	}
	
	/**
	 * 将data中的list转化成业务类实体构成的链表
	 * @param Class<T> 
	 * @return
	 */
	public <T extends BaseResponse> List<T> getList(Class<T> t) {
		List<T> list = new ArrayList<T>();
		try {
			JSONArray jArray = data.optJSONArray("list");
			for (int i = 0; i < jArray.length(); i++) {
				T obj = t.newInstance();
				obj.init(jArray.getJSONObject(i));
				list.add(obj);
			}
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return list;
	}
	
	/**
	 * 获取错误码，0表示没有错误。错误码参考:StatusCode
	 * @return
	 */
	public String getError() {
		return error;
	}

	/**
	 * 基本的提示信息
	 * @return
	 */
	public String getMsg() {
		return msg;
	}
	
	public String getStringForReponse(){
		JSONObject obj = new JSONObject();
		try {
			obj.put("error", error);
			obj.put("msg", msg);
			obj.put("data", data);
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return obj.toString();
	}
}
